﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Libreria.DAL;

namespace Libreria.SIG.Modelo
{
    [CAD(true, CAD.TiposBD._SQLServer)]
    public class Venta
    {
        // Atributo de abstracción
        private MOR accesoADatos;
        // Atributo de la clase
        private Int32? codigo;
        private Double? valorCompra;
        private DateTime fechaCompra;
        private DateTime fechaVenta;
        private Boolean? porTiquete;
        private String identificadorUsuario;
        private Int32? codigoMenu;
        private Boolean? esReserva;
        private Boolean? porInternet;
        private Boolean? pagado;
        private Boolean? entregado;

        //Constructores
        public Venta()
        {
        }

        public Venta(string cadenaDeConexion)
        {
            this.accesoADatos = MOR.Instance(cadenaDeConexion);
        }

        // Encapsulamiento de los atributos
        [Tipo(Tipo.TiposSQLServer._int, "codigoVenta", true, true)]
        public Int32? Codigo
        {
            get { return codigo; }
            set { codigo = value; }
        }

        [Tipo(Tipo.TiposSQLServer._real)]
        public Double? ValorCompra
        {
            get { return valorCompra; }
            set { valorCompra = value; }
        }

        [Tipo(Tipo.TiposSQLServer._datetime)]
        public DateTime FechaCompra
        {
            get { return fechaCompra; }
            set { fechaCompra = value; }
        }

        [Tipo(Tipo.TiposSQLServer._datetime)]
        public DateTime FechaVenta
        {
            get { return fechaVenta; }
            set { fechaVenta = value; }
        }
        
        [Tipo(Tipo.TiposSQLServer._bit)]
        public Boolean? PorTiquete
        {
            get { return porTiquete; }
            set { porTiquete = value; }
        }

        [Tipo(Tipo.TiposSQLServer._varchar)]
        public String IdentificadorUsuario
        {
            get { return identificadorUsuario; }
            set { identificadorUsuario = value; }
        }

        [Tipo(Tipo.TiposSQLServer._int)]
        public Int32? CodigoMenu
        {
            get { return codigoMenu; }
            set { codigoMenu = value; }
        }

        [Tipo(Tipo.TiposSQLServer._bit)]
        public Boolean? EsReserva
        {
            get { return esReserva; }
            set { esReserva = value; }
        }

        [Tipo(Tipo.TiposSQLServer._bit)]
        public Boolean? PorInternet
        {
            get { return porInternet; }
            set { porInternet = value; }
        }

        [Tipo(Tipo.TiposSQLServer._bit)]
        public Boolean? Pagado
        {
            get { return pagado; }
            set { pagado = value; }
        }

        [Tipo(Tipo.TiposSQLServer._bit)]
        public Boolean? Entregado
        {
            get { return entregado; }
            set { entregado = value; }
        }


        // Métodos de abstracción de datos
        public void crear()
        {
            this.Codigo = this.accesoADatos.crearRegistro(this);
        }

        public List<Venta> consultar()
        {
            List<Object> registros = this.accesoADatos.consultarRegistros(this, false);
            List<Venta> resultado = new List<Venta>();
            foreach (Object registro in registros)
            {
                resultado.Add((Venta)registro);
            }
            return resultado;
        }

        public Venta consultarPorCodigo(Int32 codigo)
        {
            this.Codigo = codigo;
            List<Object> registros = this.accesoADatos.consultarRegistros(this, true);
            Venta resultado = null;
            if (registros != null)
            {
                if (registros.Count == 1)
                {
                    resultado = (Venta)registros[0];
                }
            }
            return resultado;
        }

        public void actualizar()
        {
            this.accesoADatos.actualizarRegistro(this);
        }

        public void eliminar()
        {
            this.accesoADatos.borrarRegistro(this);
        }

    }
}
